/**
 * @file tsk_task_queue.c
 * @brief tskp库 - 任务队列模块实现文件
 * @details
 * 本文件实现了tskp任务调参库的任务队列功能，包括队列初始化、判空、判满、入队、出队等操作。
 * 任务队列用于任务调度的缓存与管理，采用静态循环队列结构，适合嵌入式、实时系统下的高效任务调度。
 *
 * 作者：小傲（个人开发）
 * 邮箱：2655640770@qq.com
 * 版权声明：开源公开，欢迎建议与反馈
 * 日期：2025-09-11
 */

#include "tsk_task_queue.h"

#ifdef _TSK_TSKP_

/**
 * @brief        // 队列初始化
 * @param[in]    // p : 指向tsk_task_Queue_t结构体的指针
 * @return       // void
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
void tsk_task_Queue_Init(tsk_task_Queue_t* p){
    p->count=0;
    p->front=0;
    p->rear=0;
}

/**
 * @brief        // 判断队列是否为空
 * @param[in]    // p : 队列结构体
 * @return       // bool : true为空，false为非空
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_is_task_Queue_Empty(tsk_task_Queue_t p){
    return p.count==0;
}

/**
 * @brief        // 判断队列是否为满
 * @param[in]    // p : 队列结构体
 * @return       // bool : true为满，false为未满
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
bool tsk_is_task_Queue_Full(tsk_task_Queue_t p){
    return p.count==TSK_MAX_TASKS_PER_QUEUE;
}

/**
 * @brief        // 推送数据入队列
 * @param[in]    // p    : 指向tsk_task_Queue_t结构体的指针
 * @param[in]    // data : 要推入的数据
 * @return       // tsk_task_queue_enum_t : 推入结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_task_queue_enum_t Tsk_task_Queue_Push(tsk_task_Queue_t *p,tsk_Parsed_t data){
    if(tsk_is_task_Queue_Full(*p)){
        return TSK_TASK_QUEUE_FULL;
    }
    p->count++;
    p->rear=(p->rear+1)%TSK_MAX_TASKS_PER_QUEUE;
    p->task_ids[p->rear]=data;
    return TSK_TASK_QUEUE_OK;
}

/**
 * @brief        // 弹出队列中的数据
 * @param[in]    // p    : 指向tsk_task_Queue_t结构体的指针
 * @param[out]   // temp : 弹出的数据指针
 * @return       // tsk_task_queue_enum_t : 弹出结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_task_queue_enum_t Tsk_task_Queue_Pop(tsk_task_Queue_t *p,tsk_Parsed_t *temp){
    if(tsk_is_task_Queue_Empty(*p)){
        return TSK_TASK_QUEUE_EMPTY;
    }
    p->front=(p->front+1)%TSK_MAX_TASKS_PER_QUEUE;
    *temp=p->task_ids[p->front];
    p->count--;
    return TSK_TASK_QUEUE_OK;
}

#endif // _TSK_TSKP_
